#ifndef ESTRATEGIARECURSOBSHARP_H_
#define ESTRATEGIARECURSOBSHARP_H_

#include "EstrategiaRecursoEscrituraDirecta.h"
#include "BloqueBSharp.h"
#include "Almacenamiento.h"

namespace Toolkit
{

class IndiceBSharp;

class AdministradorBufferingBSharp
{
public:
    AdministradorBufferingBSharp(const TipoSerializacion tserializacion,
            const unsigned long int &tamanoBloque);
    virtual ~AdministradorBufferingBSharp();

    virtual void guardarDato(const Dato &dato, const Clave &clave);

    virtual bool recuperarDato(const Clave &clave, Dato &dato);

    virtual void eliminarDato(const Clave &clave, Dato &dato);

    void agregarComponenteAlterado(const unsigned long int& nRegistro);

    /**
     * Devuelve el bloque que contiene la clave pasada, dada la psoicion en primario. Busca primero
     * dentro del almacenamiento secundario y luego en el almacenamiento primario.
     */
    BloqueBSharp *buscarBloque(const unsigned long int &posicion) const;

    /**
     * Devuelve la posicion en primario de la hoja en la que estaría la clave, si es que estuviera.
     */
    unsigned long int busquedaInexacta(const Clave &clave, const unsigned long int &nivelNodo = 0) const;

    void setIndice(IndiceBSharp *indice);

    BloqueBSharp *buscarBloque(const unsigned long int &posicion,
                bool &estaEnSecundario) const;

private:

    IndiceBSharp *indice;

    void bajarABuffer();

    /**
     * Devuelve la posicion en el alm secundario en que se encuentra el bloque correspondiente
     * al que en primario tiene la posicion especificada. Si ese bloque no está en secundario,
     * se devuelve -1.
     */
    long int posicionEnSecundario(const unsigned long int & posicionEnPrimario) const;

    list<unsigned long int> posiblesDesactualizados;

    TipoSerializacion tserializacion;
    unsigned long int tamanoBloque;

};

}

#endif /* ESTRATEGIARECURSOBSHARP_H_ */
